package com.rainszj.mapper;

import com.rainszj.pojo.po.Blog;
import com.rainszj.pojo.po.BlogAndTag;
import com.rainszj.pojo.vo.*;
import com.rainszj.pojo.dto.QueryBlog;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author rainszj
 * 2020/3/15
 */
@Repository
public interface BlogMapper {

    /**
     * 多条件查询博客
     *
     * @param queryBlog
     * @return
     */
    List<BlogQueryResult> queryBlogByTitleOrTypeOrRecommend(QueryBlog queryBlog);

    /**
     * 查询所有的博客
     *
     * @return
     */
    List<BlogQueryResult> listAdminBlog();

    /**
     * 根据 Id 查询 Blog
     *
     * @param blogId
     * @return
     */
    Blog queryBlogById(@Param("blogId") Long blogId);

    /**
     * 删除博客
     *
     * @param id
     * @return
     */
    int removeBlog(@Param("id") Long id);

    /**
     * 删除 BlogAndTag 表中 blogId
     *
     * @param blogId
     * @return
     */
    int removeBlogAndTag(@Param("blogId") Long blogId);

    /**
     * 保存博客
     *
     * @param blog
     * @return
     */
    int saveBlog(Blog blog);


    /**
     * 保存博客和标签的多对多关系
     *
     * @param bat
     * @return
     */
    int saveBlogAndTag(@Param("bat") BlogAndTag bat);

    /**
     * 通过Id获取要更新的博客
     *
     * @param id
     * @return
     */
    UpdateBlog getToUpdateBlogById(@Param("id") Long id);

    /**
     * 修改博客
     *
     * @param id
     * @param blog
     * @return
     */
    int updateBlog(@Param("id") Long id, @Param("blog") UpdateBlog blog);

    /**
     * 查询首页展示的博客
     *
     * @return
     */
    List<IndexBlog> listIndexBlog();

    /**
     * 获取最新发布的博客
     *
     * @param number
     * @return
     */
    List<LatestBlog> listLatestBlog(@Param("number") int number);

    /**
     * 通过 id获取博客详情
     *
     * @param id
     * @return
     */
    DetailedBlog getDetailedBlogById(@Param("id") Long id);

    /**
     * 通过分类 Id 查询要显示的博客卡片
     *
     * @param typeId
     * @return
     */
    List<IndexBlog> getIndexBlogByTypeId(@Param("typeId") Long typeId);

    /**
     * 通过标签 Id 查询要显示的博客卡片
     *
     * @param tagId
     * @return
     */
    List<IndexBlog> getIndexBlogByTagId(@Param("tagId") Long tagId);

    /**
     * 通过 匹配字符串进行查询
     *
     * @param queryStr
     * @return
     */
    List<IndexBlog> queryBlogByString(@Param("queryStr") String queryStr);

    /**
     * 通过查询博客详情页，更新浏览次数，管理员查看不更新
     *
     * @param id
     * @return
     */
    int updateBlogViews(@Param("id") Long id);

    /**
     * 通过年份进行分组
     *
     * @return
     */
    List<String> queryGroupByYear();

    /**
     * 查询指定年份下公布的所有博客
     *
     * @param year
     * @return
     */
    List<ArchiveBlog> queryBlogByYear(@Param("year") String year);

    /**
     * 查询博所有发布博客的数量
     *
     * @return
     */
    int countBlog();

}
